<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 例子：充值抽奖
        // 充值达到500元可抽100元，达到20元可抽20元，否则无奖
        // 使用职责链实现 问题：如果再添加一个抽奖活动，则代码又需要重新修改，不符合开闭原则（对修改关闭，对扩展开放）
        // function order500(orderType,isPay,count) {
        //     if(orderType == 1 && isPay) {
        //         console.log("您中奖了100元");
        //     }else{
        //         order200(orderType,isPay,count)
        //     }
        // }
        // function order200(orderType,isPay,count) {
        //     if(orderType == 2 && isPay) {
        //         console.log("您中奖了20元");
        //     }else{
        //         orderNormal(orderType,isPay,count)
        //     }
        // }
        // function orderNormal(orderType,isPay,count) {
        //    if(count > 0) {
        //        console.log("您已抽到10元");
        //    }else{
        //        console.log("谢谢参与");
        //    }
        // }

        // 使用职责链重构代码
        function order500(orderType,isPay,count) {
            if(orderType == 1 && isPay) {
                console.log("您中奖了100元");
            }else{
               return "nextSuccessor"
            }
        }
        function order200(orderType,isPay,count) {
            if(orderType == 2 && isPay) {
                console.log("您中奖了20元");
            }else{
                return "nextSuccessor"
            }
        }
        function orderNormal(orderType,isPay,count) {
           if(count > 0) {
               console.log("您已抽到10元");
           }else{
               console.log("谢谢参与");
           }
        }
        // 职责链关系对象
        function Chain(fn) {
            this.fn = fn;
            this.successor = null;
        }
        Chain.prototype.setNextSuccessor = function(successor) {
            this.successor = successor;
        }
        Chain.prototype.passRequest = function() {
            var ret = this.fn.apply(this,arguments);
            if(ret === "nextSuccessor") {
                this.successor.passRequest.apply(this.successor,arguments)
            }
        }
        // 实例化职责链
        var chainOrder500 = new Chain(order500);
        var chainOrder200 = new Chain(order200);
        var chainOrderNormal = new Chain(orderNormal);
        // 把链子串起来
        chainOrder500.setNextSuccessor(chainOrder200);
        chainOrder200.setNextSuccessor(chainOrderNormal);

        chainOrder500.passRequest(1,true,500)
        chainOrder200.passRequest(2,true,100)
    </script>
</body>
</html>